In developing computer programs, programmers often use "debugging" tools to enable them to verify correct operation of the programs. Using debugging tools, programmers can step through a program and determine whether the results that the program generates at various points are as would be expected. If the results are correct at one point, and not at a subsequent point, the programmer can expect that the portion of a program between the two points is in error.
Atypical computer program consists of a number of routines, generally including one "main" routine which serves as an entry point when the program is initially booted up. During processing, the main routine generally will call one or a number of other routines, and each of the called routines may call yet other routines. A program may include a number of routines which call each other in a number of levels, something in the form of a tree. The particular series of routines that are called during processing depends upon the particular set of data that are processed. To aid in debugging, program developers often put at various points in the main routine and various other routines instructions that enable the computer to effectively stop processing of the program and report the location in the program at which they stopped. Such a report includes not only the particular routine and source code line number at which the computer stopped, but also the path through the program "tree" taken by the computer in getting to the point at which the computer stopped, which path also includes the identification of the series of routines traversed to the routine in which the stop occurred, as well as the source code line in each routine at which the lower-level routine was called. The result, termed herein a call stack listing, is detailed information as to the path taken by the computer in traversing the tree to the point at which the stop occurred.
In a conventional single-processor ("uni-processor") computer, the call stack listing is relatively easy to interpret. In recently-developed multi-processor systems, most notably in parallel processors which use "multiple-instruction/multiple-data" ("MIMD") or "single-program/multiple-data" ("SPMD") processing methodologies, each processor may be processing generally the same program on separate and distinct data, and so would likely proceed along different paths in the program "tree." In a conventional debugger, a call stack listing would be provided for each of the processors when they encounter the instruction to stop. The collection of call stack listings can be difficult to intepret and use, particularly when the computer includes a number of processors.